package com.example.redis.deserializer;

import com.example.redis.pojo.User;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import sun.reflect.Reflection;

import java.io.IOException;
import java.lang.reflect.Field;

public class UserDeserializer extends StdDeserializer<User> {
    public UserDeserializer(Class<?> vc) {
        super(vc);
    }
    @Override
    public User deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        User user = new User();
        Class<? extends User> userClass = user.getClass();
        while(!parser.isClosed()){
            JsonToken jsonToken = parser.nextToken();
            //如果jsonToken是普通字段名FIELD_NAME，则进行获取属性名parser.getCurrentName()
            try{
                if(JsonToken.FIELD_NAME.equals(jsonToken)){
                    String field=parser.getCurrentName();
                    System.out.println(field);
                    //获取属性的值
                    jsonToken = parser.nextToken();
                    System.out.println(jsonToken);
                    Field declaredField = userClass.getDeclaredField(field);
                    declaredField.setAccessible(true);
                    //判断该值是什么类型
                    if(JsonToken.VALUE_STRING.equals(jsonToken)){
                        declaredField.set(user,parser.getValueAsString());
                        System.out.println(parser.getValueAsString());
                    }
                    else if(JsonToken.VALUE_NUMBER_INT.equals(jsonToken)){
                        declaredField.set(user,parser.getValueAsInt());
                        System.out.println(parser.getValueAsInt());
                    }
                    //数组类型是很难处理的，用到了再去写吧，可以参考源码写。JsonNodeDeserializer的deserializeArray
                    else if(JsonToken.START_ARRAY.equals(jsonToken)){
                        System.out.println("==============");
                        //获取属性的值
                        jsonToken = parser.nextToken();
                        while (!JsonToken.END_ARRAY.equals(jsonToken)){
                            System.out.println(parser.getValueAsString()+" || "+parser.getValueAsInt());
                            jsonToken = parser.nextToken();
                        }
                        System.out.println("==============");
                    }
                }
            }catch (Exception e){
                //获取到不存在的字段，可以报错，也可以不处理。
                e.printStackTrace();
            }finally {
            }
        }
        return user;
    }



}
